import mindspore
from mindspore import nn, ops
from mindspore import Tensor, Parameter
from numpy import random


class LogisticModel(nn.Cell):
    def __init__(self, num_features=30):
        super().__init__()

        # 初始化网络的权重参数
        mu = 0
        sigma = 0.1
        random.seed(0)
        # 使用均值为mu，方差为sigma的正态分布初始化权重矩阵w
        w = random.normal(mu, sigma, num_features)
        w = w.reshape((num_features, 1))

        self.W = Parameter(Tensor(w, dtype=mindspore.float32), name='W')
        self.b = Parameter(Tensor(0.0), name='b')

    def construct(self, X):
        """输入X的shape为（N,num_features）
            其中，N为样本数量（或批次大小），num_features为样本特征数量
        """
        Z = ops.matmul(X, self.W) + self.b
        return ops.sigmoid(Z)

class LogisticModel1(nn.Cell):
    """
    LogisticModel的更简易的实现,且没有参数的手动初始化（这影响较大）
    """
    def __init__(self, num_features=30):
        super().__init__()

        # 初始化网络的权重参数
        self.layer = nn.Dense(30, 1)
        self.act = nn.Sigmoid()

    def construct(self, X):
        """输入X的shape为（N,num_features）
            其中，N为样本数量（或批次大小），num_features为样本特征数量
        """
        Z = self.layer(X)
        Z = self.act(Z)
        return Z


model = LogisticModel1()


if __name__ == "__main__":
    X = ops.randn(128, 30)
    pred = model(X)
    print(pred.shape)